//#ifndef __OgreApplication_h__
//#define __OgreApplication_h__
//
//#include <ogre.h>
//using namespace Ogre;
//
//
//class CEngine : public FrameListener
//{
//public:
//	CEngine(void);
//	virtual ~CEngine(void);
//
//	virtual void go(void);
//
//protected:
//	virtual bool initialise();
//	virtual bool initOgreCore();
//
//	virtual void createSceneManager();
//	virtual void createCamera();
//	virtual void createViewports();
//	virtual void createResourceListener();
//	virtual void createFrameListener();
//
//	virtual void addResourceLocations();
//	virtual void initResources();
//
//	virtual void createScene() = 0; // I am pure virtual, override me!
//	virtual void destroyScene();
//
//	// FrameListener overrides 
//	virtual bool frameStarted(const FrameEvent& evt); 
//	virtual bool frameEnded(const FrameEvent& evt); 
//
//	virtual void moveCamera();
//
//	Root *mRoot;
//	Camera* mCamera;
//	SceneManager* mSceneMgr;
//	RenderWindow* mWindow;
//
//	Real mMoveSpeed; 
//	Degree mRotateSpeed; 
//	float mMoveScale; 
//	Degree mRotScale; 
//	Vector3 mTranslateVector; 
//	Radian mRotX, mRotY; 
//
//};
//
//#endif // __OgreApplication_h__

#pragma once

#include <ogre.h>
#include <memory>
//using namespace Ogre;
//class UI;
class CInputManager;
//class CGame;
//class MainMenuDlg;
class CEngine : public Ogre::FrameListener , public Ogre::Singleton<CEngine>
{ 
public: 
	CEngine(); 
	virtual ~CEngine(); 

	virtual void go(); 
    const Ogre::SceneManager* getSceneManager() const { return mSceneMgr;}
    Ogre::SceneManager* getSceneManager() { return mSceneMgr;}
    const Ogre::Camera* getCamera() const { return mCamera; }
    Ogre::Camera* getCamera() { return mCamera; }
    
    const std::string& folder() { return mFolder; } 
protected: 
	virtual bool initialise(); 

	virtual bool initOgreCore(); 

	virtual void createSceneManager(); 
	virtual void createCamera(); 
	virtual void createViewports(); 
	virtual void createResourceListener(); 
	virtual void createFrameListener(); 

	virtual void createScene() = 0; // pure virtual - this has to be overridden 
	virtual void destroyScene(); 

	virtual void addResourceLocations(); 
	virtual void initResources(); 

	virtual void updateStats(); 
	void showDebugOverlay(bool show); 

	virtual void moveCamera(); 

    virtual bool processUnbufferedKeyInput(const Ogre::FrameEvent& evt); 
	virtual bool processUnbufferedMouseInput(const Ogre::FrameEvent& evt); 

	// FrameListener overrides 
	virtual bool frameStarted(const Ogre::FrameEvent& evt); 
	virtual bool frameEnded(const Ogre::FrameEvent& evt); 

    Ogre::Camera* mCamera; 
	Ogre::SceneManager* mSceneMgr; 
	Ogre::RenderWindow* mWindow; 
	Ogre::Real mMoveSpeed; 
	Ogre::Degree mRotateSpeed; 
	Ogre::Overlay* mDebugOverlay; 
    CInputManager *mInputMgr;
	//InputReader* mInputDevice; 
	Ogre::Vector3 mTranslateVector; 
	float mMoveScale; 
	Ogre::Degree mRotScale; 
	Ogre::Radian mRotX, mRotY; 

    //==============================================================================
    // zlzhou
    std::string mFolder;
private: 
	Ogre::Real mTimeUntilNextToggle; 
	int mSceneDetailIndex ; 
	bool mStatsOn; 
	unsigned int mNumScreenShots; 
	Ogre::TextureFilterOptions mFiltering; 
	int mAniso; 
};

